package com.zxs.user.service.impl;

import com.zxs.user.mapper.UserMapper;
import com.zxs.user.service.UserService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import constants.UserConstants;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import parm.PageParam;
import parm.UserCheckParm;
import parm.UserLoginParm;
import pojo.User;
import utils.MD5Util;
import utils.R;

import java.util.List;

/**
 * @author zxs
 * *7 9:26
 */
@Service
@Slf4j
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;

    /**
     * 查询账号是否可用
     *
     * @param userCheckParm
     * @return
     */
    @Override
    public R check(UserCheckParm userCheckParm) {
        //条件查询封装参数
        QueryWrapper<User> wrapper = new QueryWrapper<User>();
        wrapper.eq("user_name", userCheckParm.getUserName());
        Long count = userMapper.selectCount(wrapper);

        if (count == 0) {
            // 数据库没有查询到，表示账号可用
            log.info("账号可用");
            return R.ok("账号可用");
        }
        //账号存在，则不可用
        log.info("账号则不可用");
        return R.fail("账号已存在,不可使用！");
    }

    /**
     * 用户登录，只需要俩个参数
     *
     * @param userLoginParm
     * @return
     */
    @Override
    public R login(UserLoginParm userLoginParm) {
        //1. 对密码加密，
        String newPwd = MD5Util.encode(userLoginParm.getPassword() + UserConstants.USER_SALT);
        //2. 封装条件，并将用户名和加密后的密码作为查询条件查询数据库
        QueryWrapper<User> wrapper = new QueryWrapper<User>();
        wrapper.eq("user_name", userLoginParm.getUserName());
        wrapper.eq("password", newPwd);
        User user = userMapper.selectOne(wrapper);
        if (user == null) {
            return R.fail("登录失败，账号或密码错误");
        }
        //不返回密码
        user.setPassword(null);
        return R.ok("登录成功", user);
    }


    /**
     * 用户注册
     *
     * @param user
     * @return
     */
    @Override
    public R register(User user) {
        //1.判断用户输入的账户名是否在数据库存在
        QueryWrapper<User> wrapper = new QueryWrapper<User>();
        wrapper.eq("user_name", user.getUserName());
        Long count = userMapper.selectCount(wrapper);
        if (count > 0) {
            //存在，则返回失败信息，用户已存在
            return R.fail("账户已存在，无法注册，请重新输入！");
        }
        //2.如果不为空，对密码进行MD5加密
        String newPwd = MD5Util.encode(user.getPassword() + UserConstants.USER_SALT);
        user.setPassword(newPwd);
        //3.插入数据库
        int insert = userMapper.insert(user);
        //4.处理插入结果
        if (insert == 0) {
            return R.fail("注册失败，稍后重试！");
        }
        return R.ok("注册成功！");
    }

    /**
     * 根据页码 返回后台需要的用户列表
     *
     * @param pageParam
     * @return
     */
    @Override
    public R list(PageParam pageParam) {
        Page<User> userPage = new Page<>(pageParam.getCurrentPage(), pageParam.getPageSize());

        Page<User> userList = userMapper.selectPage(userPage, null);
        List<User> records = userList.getRecords();
        long total = userList.getTotal();

        log.info("UserList: " + userList);
        return R.ok("用户列表查询成功", records, total);
    }

    /**
     * 后台删除某个用户
     *
     * @param userId
     * @return
     */
    @Override
    public R remove(Integer userId) {
        int deleteById = userMapper.deleteById(userId);
        if (deleteById == 0) {
            return R.fail("用户删除失败");
        }
        return R.ok("用户删除成功");
    }

    /**
     * 后台修改用户信息
     *
     * @param user
     * @return
     */
    @Override
    public R update(User user) {

        //查看用户密码是否修改，否则保存的就是加密后的密码，下次登录还要加密就永远无法登录了
        QueryWrapper<User> wrapper = new QueryWrapper<User>();
        wrapper.eq("user_id", user.getUserId());
        wrapper.eq("password", user.getPassword());
        Long count = userMapper.selectCount(wrapper);
        if (count == 0) {
            //说明密码更改了
            user.setPassword(MD5Util.encode(user.getPassword()+UserConstants.USER_SALT));
        }
        int i = userMapper.updateById(user);
        log.info("user updated: ", i);
        return R.ok("用户信息修改成功！");
    }

    /**
     * 添加用户相当于 注册业务
     * @param user
     * @return
     */
    @Override
    public R save(User user) {

        //1.判断用户输入的账户名是否在数据库存在
        QueryWrapper<User> wrapper = new QueryWrapper<User>();
        wrapper.eq("user_name", user.getUserName());
        Long count = userMapper.selectCount(wrapper);
        if (count > 0) {
            //存在，则返回失败信息，用户已存在
            return R.fail("账户已存在，无法添加，请重新输入！");
        }
        //2.如果不为空，对密码进行MD5加密
        String newPwd = MD5Util.encode(user.getPassword() + UserConstants.USER_SALT);
        user.setPassword(newPwd);
        //3.插入数据库
        int insert = userMapper.insert(user);
        //4.处理插入结果
        if (insert == 0) {
            return R.fail("添加失败，稍后重试！");
        }
        return R.ok("添加成功！");

    }
}
